package com.jxpanda.spring.module.auth.core.register.strategy;

import com.jxpanda.spring.module.auth.core.OAuth2Strategy;
import com.jxpanda.spring.module.auth.core.exception.UserNotFoundException;
import com.jxpanda.spring.module.auth.core.user.OAuth2UserContext;
import org.springframework.security.core.userdetails.UserDetails;
import reactor.core.publisher.Mono;

public interface OAuth2ReactiveRegisterStrategy extends OAuth2Strategy {

    /**
     * 是否需要自动注册的判断
     * 如果是true的话，会直接调用register()函数（后端服务自动完成流程）
     * 否则会返回一个数据包，然后用户通过registerEndpoint端点来注册（判断流程交由前端是否调用判断）
     */
    default boolean shouldAutoRegister() {
        return false;
    }

    /**
     * 注册
     */
    default <T extends UserDetails> Mono<T> register(OAuth2UserContext oAuth2UserContext) {
        return Mono.empty();
    }

    /**
     * 不自动注册的时候调用的函数
     */
    default <T extends UserDetails> Mono<T> fallback(OAuth2UserContext oAuth2UserContext) {
        return Mono.error(new UserNotFoundException(oAuth2UserContext, "User not found"));
    }

}
